import api from '@/api/iap/index';
import { getToken, getUser, setToken, setUser, removeToken, removeUser } from './localStorage';
const appId = 'cli_a8279c2c4cf0100c'
// 🔴 新增：登录并发锁（防止多次调用导致重复授权）
let isLogging = false;
// 🔴 新增：登录等待队列（并发调用时排队处理）
let loginQueue = [];

/**
 * 授权登录主函数
 * @returns {Promise<{accessToken: string, openid: string, nickname?: string, avatar?: string}>}
 */
export function codeLogin() {
    return new Promise((resolve, reject) => {
        // 1. 若已有登录请求正在执行，加入队列等待
        if (isLogging) {
            loginQueue.push({ resolve, reject });
            return;
        }

        // 2. 开始登录流程，加锁
        isLogging = true;

        // 🔴 修复：用 let 声明（需重新赋值）
        let cachedToken = getToken();
        let cachedUser = getUser();

        console.log('🔍 本地缓存：', { cachedToken, cachedUser });

        // 3. 缓存校验：token 存在但 user 解析失败时，清除无效缓存
        if (cachedToken && !cachedUser) {
            console.warn('⚠️ Token存在但用户信息无效，清除缓存');
            removeToken();
            removeUser();
            cachedToken = null;
        }

        // 4. 🔴 优化：可配置的必要字段校验（业务扩展更灵活）
        const requiredUserFields = ['openid']; // 可根据业务添加其他字段
        const isCacheValid = cachedToken && cachedUser &&
            requiredUserFields.every(field => cachedUser[field]);

        if (isCacheValid) {
            console.log('✅ 缓存有效，直接使用');
            const result = { accessToken: cachedToken, ...cachedUser };
            // 唤醒队列中等待的请求
            
            resolveQueue(result, 'success');
            resolve(result);
            // 解锁
            isLogging = false;
            return;
        }

        // 5. 缓存无效，执行授权登录（🔴 修复：传递 resolve/reject 确保Promise链完整）
        refreshLogin()
            .then((loginResult) => {
                resolveQueue(loginResult, 'success');
                resolve(loginResult);
            })
            .catch((error) => {
                resolveQueue(error, 'fail');
                reject(error);
            })
            .finally(() => {
                isLogging = false; // 无论成败都解锁
            });
    });
}

/**
 * 刷新登录（获取授权码 + 调用登录接口）
 * @returns {Promise<{accessToken: string, openid: string, nickname?: string, avatar?: string}>}
 */
export function refreshLogin() {
    return new Promise((resolve, reject) => {
        // 字节小程序获取授权码
        window.tt.requestAuthCode({
            appId: appId,
            success: (res) => {
                const authData = {
                    type: '40',
                    code: res.code,
                    state: Date.now().toString() // 🔴 修复：确保state是字符串（避免后端解析问题）
                };

                // 调用后端登录接口
                api.code_login(authData)
                    .then((loginRes) => {
                        const { data: loginData } = loginRes;
                        // 🔴 优化：环境区分日志（生产环境不打印详细数据）
                        if (process.env.NODE_ENV === 'development') {
                            console.log('📥 登录接口返回：', loginData);
                        }

                        // 校验返回数据完整性
                        if (!loginData || !loginData.accessToken || !loginData.openid) {
                            return reject(new Error('登录失败：缺少token或openid'));
                        }

                        // 保存token和用户信息
                        setToken(loginData.accessToken);
                        const userInfo = {
                            nickname: loginData.nickname || '',
                            openid: loginData.openid,
                            avatar: loginData.avatar || ''
                        };
                        setUser(userInfo);

                        resolve({ accessToken: loginData.accessToken, ...userInfo });
                    })
                    .catch((apiErr) => {
                        console.error('❌ 登录接口失败：', apiErr.message || apiErr);
                        reject(new Error(`登录接口异常：${apiErr.message || '未知错误'}`));
                    });
            },
            fail: (codeErr) => {
                console.error('❌ 获取授权码失败：', codeErr.errMsg);
                reject(new Error(`授权失败：${codeErr.errMsg || '无法获取授权码'}`));
            }
        });
    });
}

/**
 * 🔴 新增：唤醒登录等待队列中的请求
 * @param {any} result - 登录结果（成功时为用户信息，失败时为错误对象）
 * @param {string} type - 结果类型（success/fail）
 */
function resolveQueue(result, type) {
    if (loginQueue.length === 0) return;
    loginQueue.forEach(({ resolve, reject }) => {
        type === 'success' ? resolve(result) : reject(result);
    });
    // 清空队列
    loginQueue = [];
}